// 数学类使用示例 - zh-math.js
// 支持 CommonJS 和 ES 模块导入
const mathModule = require('../../zh/公共函数/zh-math.js');
const { 数学, 向量 } = mathModule || {
  数学: mathModule.数学 || mathModule.default?.数学,
  向量: mathModule.向量 || mathModule.default?.向量
};

// 定义角度转换常量
const 角度转弧度 = Math.PI / 180;
const 弧度转角度 = 180 / Math.PI;

console.log('=== 数学类 (zh-math.js) 使用示例 ===\n');

// 1. 基本数学运算
console.log('1. 基本数学运算');
const num1 = new 数学(10);
console.log('初始值:', num1.取值());

// 链式调用基本运算
const result1 = num1.加(5).乘(2).减(10).除(5);
console.log('10 + 5 * 2 - 10 / 5 =', result1.取值());

// 重置值并进行幂运算
const result2 = new 数学(3).幂(2).平方根();
console.log('√(3²) =', result2.取值());

// 不同数值类型的处理
const result3 = new 数学('42').加('8');
console.log('"42" + "8" =', result3.取值());

// 除以零的处理
const result4 = new 数学(10).除(0);
console.log('10 / 0 =', result4.取值());

// 取余运算
const result5 = new 数学(15).取余(4);
console.log('15 % 4 =', result5.取值());

// 立方根
const result6 = new 数学(27).立方根();
console.log('∛27 =', result6.取值());

console.log('');

// 2. 数值格式化与转换
console.log('2. 数值格式化与转换');
const num2 = new 数学(1234.56789);

// 固定小数位
console.log('固定2位小数:', num2.克隆().固定小数(2));

// 转换为本地化字符串
console.log('本地化字符串:', num2.克隆().转本地字符串('zh-CN'));

// 科学记数法
console.log('科学记数法:', num2.克隆().科学记数(3));

// 指定精度
console.log('指定精度4位:', num2.克隆().精度(4));

// 转换为整数和浮点数
console.log('转为整数:', new 数学('123.456').转整数().取值());
console.log('转为浮点数:', new 数学('789').转浮点数().取值());

console.log('');

// 3. 取整与四舍五入
console.log('3. 取整与四舍五入');
const num3 = new 数学(123.456);

console.log('取整:', num3.克隆().取整().取值());
console.log('向上取整:', num3.克隆().向上取整().取值());
console.log('向下取整:', num3.克隆().向下取整().取值());
console.log('四舍五入:', num3.克隆().四舍五入().取值());
console.log('四舍五入到2位小数:', num3.克隆().四舍五入(2).取值());

console.log('');

// 4. 三角函数和角度转换
console.log('4. 三角函数和角度转换');

// 角度转弧度
const angle = 45;
const radians = new 数学(angle).角度转弧度().取值();
console.log(`${angle}度 = ${radians.toFixed(4)}弧度`);

// 计算三角函数值
console.log(`sin(${angle}°) = ${new 数学(radians).正弦().取值().toFixed(4)}`);
console.log(`cos(${angle}°) = ${new 数学(radians).余弦().取值().toFixed(4)}`);
console.log(`tan(${angle}°) = ${new 数学(radians).正切().取值().toFixed(4)}`);

// 反三角函数
const sinValue = 0.5;
const asinRadians = new 数学(sinValue).反正弦().取值();
const asinDegrees = new 数学(asinRadians).弧度转角度().取值();
console.log(`arcsin(0.5) = ${asinDegrees.toFixed(1)}度`);

// 双曲函数
console.log(`sinh(1) = ${new 数学(1).双曲正弦().取值().toFixed(4)}`);
console.log(`cosh(1) = ${new 数学(1).双曲余弦().取值().toFixed(4)}`);
console.log(`tanh(1) = ${new 数学(1).双曲正切().取值().toFixed(4)}`);

console.log('');

// 5. 范围限制和插值
console.log('5. 范围限制和插值');

// 限制范围
console.log('限制 15 在 0-10 范围内:', new 数学(15).限制范围(0, 10).取值());
console.log('限制 -5 在 0-10 范围内:', new 数学(-5).限制范围(0, 10).取值());

// 线性插值
const start = 10;
const end = 20;
const t1 = 0.3; // 30% 插值
const t2 = 0.7; // 70% 插值

console.log(`从${start}到${end}的${t1 * 100}%插值:`, 
  new 数学(start).线性插值(end, t1).取值());
console.log(`从${start}到${end}的${t2 * 100}%插值:`, 
  new 数学(start).线性插值(end, t2).取值());

console.log('');

// 6. 数学属性检查
console.log('6. 数学属性检查');

const check1 = new 数学(42);
const check2 = new 数学(42.5);
const check3 = new 数学(Infinity);
const check4 = new 数学(NaN);

console.log('42 是整数:', check1.是整数());
console.log('42.5 是整数:', check2.是整数());
console.log('42 是有限数:', check1.是有限数());
console.log('Infinity 是有限数:', check3.是有限数());
console.log('42 是NaN:', check1.是NaN());
console.log('NaN 是NaN:', check4.是NaN());

console.log('');

// 7. 静态方法使用 - 随机数生成
console.log('7. 静态方法使用 - 随机数生成');

// 随机浮点数
console.log('0-1之间的随机数:', 数学.随机());
console.log('1-10之间的随机浮点数:', 数学.随机数(1, 10));

// 随机整数
console.log('1-6之间的随机整数 (骰子):', 数学.随机整数(1, 6));
console.log('-10到10之间的随机整数:', 数学.随机整数(-10, 10));

// 随机布尔值
console.log('随机布尔值:', 数学.随机布尔值());

// 随机字符串
console.log('默认随机字符串:', 数学.随机字符串());
console.log('长度为12的随机字符串:', 数学.随机字符串(12));
console.log('只包含数字的随机字符串:', 
  数学.随机字符串(6, '0123456789'));

console.log('');

// 8. 静态方法使用 - 几何计算
console.log('8. 静态方法使用 - 几何计算');

// 两点间距离
console.log('点(1,2)到点(4,6)的距离:', 数学.距离(1, 2, 4, 6));

// 向量计算
console.log('向量(3,4)的长度:', 数学.向量长度(3, 4));
console.log('向量(1,2)和向量(3,4)的点积:', 数学.向量点积(1, 2, 3, 4));
console.log('向量(1,2)和向量(3,4)的叉积:', 数学.向量叉积(1, 2, 3, 4));

// 归一化向量
console.log('向量(3,4)归一化:', JSON.stringify(数学.归一化向量(3, 4)));

// 角度计算
console.log('标准化 400 度:', 数学.标准化角度(400));
console.log('标准化 -45 度:', 数学.标准化角度(-45));
console.log('10度和350度之间的最小差值:', 数学.角度差值(10, 350));

console.log('');

// 9. 静态方法使用 - 矩阵运算
console.log('9. 静态方法使用 - 矩阵运算');

// 创建矩阵
const matrixA = [[1, 2], [3, 4]];
const matrixB = [[5, 6], [7, 8]];

// 矩阵加法
console.log('矩阵加法:');
console.log(JSON.stringify(数学.矩阵加法(matrixA, matrixB)));

// 矩阵乘法
console.log('矩阵乘法:');
console.log(JSON.stringify(数学.矩阵乘法(matrixA, matrixB)));

// 矩阵与标量乘法
console.log('矩阵与标量(2)乘法:');
console.log(JSON.stringify(数学.矩阵标量乘法(matrixA, 2)));

// 创建特殊矩阵
console.log('3x3单位矩阵:');
console.log(JSON.stringify(数学.创建单位矩阵(3)));

// 创建变换矩阵
console.log('90度旋转矩阵:');
console.log(JSON.stringify(数学.创建旋转矩阵(90)));

console.log('缩放矩阵(2, 0.5):');
console.log(JSON.stringify(数学.创建缩放矩阵(2, 0.5)));

console.log('平移矩阵(10, 20):');
console.log(JSON.stringify(数学.创建平移矩阵(10, 20)));

console.log('');

// 10. 静态方法使用 - 统计函数
console.log('10. 静态方法使用 - 统计函数');

// 计算统计值
console.log('平均值(1,2,3,4,5):', 数学.平均值(1, 2, 3, 4, 5));
console.log('中位数(1,3,5,7,9):', 数学.中位数(1, 3, 5, 7, 9));
console.log('中位数(1,3,5,7):', 数学.中位数(1, 3, 5, 7));
console.log('标准差(1,2,3,4,5):', 数学.标准差(1, 2, 3, 4, 5).toFixed(4));

console.log('');

// 11. 静态方法使用 - 通用数学函数
console.log('11. 静态方法使用 - 通用数学函数');

// 取符号
console.log('符号(-42):', 数学.取符号(-42));
console.log('符号(0):', 数学.取符号(0));
console.log('符号(42):', 数学.取符号(42));

// 对数计算
console.log('ln(e):', 数学.取对数(Math.E));
console.log('log10(100):', 数学.取对数10(100));
console.log('log2(8):', 数学.取对数2(8));

// 取最大最小值
console.log('最大值(5, 10, 1, 8):', 数学.取最大(5, 10, 1, 8));
console.log('最小值(5, 10, 1, 8):', 数学.取最小(5, 10, 1, 8));

// 解析数字
console.log('解析浮点("123.45"):', 数学.解析浮点("123.45"));
console.log('解析整数("0xFF", 16):', 数学.解析整数("0xFF", 16));

console.log('');

// 12. 向量类使用示例
console.log('12. 向量类使用示例');

// 创建向量
const v1 = new 向量(3, 4, 5);
console.log('向量(3,4,5)的长度:', v1.获取长度());

// 归一化向量
const v2 = new 向量(3, 4, 5);
v2.归一化();
console.log('归一化后的向量:', `(${v2.x.toFixed(4)}, ${v2.y.toFixed(4)}, ${v2.z.toFixed(4)})`);

// 向量点积和叉积（基于静态方法）
const v3 = {x: 1, y: 2, z: 3};
const v4 = {x: 4, y: 5, z: 6};
console.log('向量点积:', 数学.向量点积(v3.x, v3.y, v4.x, v4.y));
console.log('向量叉积:', 数学.向量叉积(v3.x, v3.y, v4.x, v4.y));

console.log('');

// 13. 实际应用场景
console.log('13. 实际应用场景');

// 场景1: 计算几何 - 三角形面积
function 计算三角形面积(x1, y1, x2, y2, x3, y3) {
  // 使用向量叉积计算面积
  const 面积 = Math.abs(数学.向量叉积(x2-x1, y2-y1, x3-x1, y3-y1)) / 2;
  return 面积;
}

console.log('三角形(0,0), (4,0), (0,3)的面积:', 计算三角形面积(0,0,4,0,0,3));

// 场景2: 游戏开发 - 角色移动
function 计算新位置(x, y, 角度, 距离) {
  const 弧度 = 角度 * 角度转弧度;
  const 新X = x + Math.cos(弧度) * 距离;
  const 新Y = y + Math.sin(弧度) * 距离;
  return { x: 新X, y: 新Y };
}

console.log('从点(0,0)以45度移动10单位后的新位置:', 
  JSON.stringify(计算新位置(0, 0, 45, 10), null, 2));

// 场景3: 数据可视化 - 归一化数据
function 归一化数据集(数据数组, 最小值, 最大值) {
  return 数据数组.map(值 => {
    return new 数学(值)
      .限制范围(最小值, 最大值)
      .线性插值(1, (值 - 最小值) / (最大值 - 最小值))
      .取值();
  });
}

const 原始数据 = [10, 20, 30, 40, 50];
const 归一化数据 = 归一化数据集(原始数据, 10, 50);
console.log('归一化数据 [10,20,30,40,50] 到 0-1 范围:', 归一化数据);

// 场景4: 概率模拟 - 随机漫步
function 随机漫步(步数, 步长) {
  let x = 0, y = 0;
  for (let i = 0; i < 步数; i++) {
    const 角度 = 数学.随机() * Math.PI * 2; // 0-360度随机角度
    x += Math.cos(角度) * 步长;
    y += Math.sin(角度) * 步长;
  }
  return { x, y, 总距离: 数学.向量长度(x, y) };
}

const 漫步结果 = 随机漫步(100, 1);
console.log('随机漫步100步后的位置:', 
  `(${漫步结果.x.toFixed(2)}, ${漫步结果.y.toFixed(2)}), 距离原点: ${漫步结果.总距离.toFixed(2)}`);

// 场景5: 颜色处理 - HSL到RGB转换（简化版）
function 简化HSL转RGB(h, s, l) {
  // 将HSL值归一化到0-1范围
  h = new 数学(h).角度转弧度().取值() / (2 * Math.PI);
  s = new 数学(s).限制范围(0, 100).取值() / 100;
  l = new 数学(l).限制范围(0, 100).取值() / 100;
  
  // 简化的转换（实际实现会更复杂）
  const c = (1 - Math.abs(2 * l - 1)) * s;
  const x = c * (1 - Math.abs((h * 6) % 2 - 1));
  const m = l - c / 2;
  
  // 这里只返回近似值用于演示
  return {
    r: Math.round((x + m) * 255),
    g: Math.round((c + m) * 255),
    b: Math.round(m * 255)
  };
}

console.log('HSL(0, 100%, 50%) 近似转换为RGB:', 
  JSON.stringify(简化HSL转RGB(0, 100, 50)));

console.log('\n=== 所有示例执行完毕 ===');
